#include <iostream>
#include <unistd.h>
#include <cstdio>
#include "Comm.hpp"

// 阻塞版本
// int main()
// {
//     char buffer[1024];
//     while (true)
//     {
//         printf("Enter# "); // 没有回车不会直接刷新缓冲器数据，需手动刷新
//         fflush(stdout);
//         ssize_t n = read(0, buffer, sizeof(buffer));
//         if (n > 0)
//         {
//             buffer[n] = 0;
//             printf("echo# %s", buffer); // 会输入\n无需手动加
//         }
//         else if (n == 0)
//         {
//             printf("read done\n");
//             break;
//         }
//         else
//         {
//             perror("read");
//             break;
//         }
//     }
//     return 0;
// }

// 非阻塞版本
int main()
{
    char buffer[1024];
    SetNonBlock(0); // 设置非阻塞等待
    while (true)
    {
        printf("Enter# "); // 没有回车不会直接刷新缓冲器数据，需手动刷新
        fflush(stdout);
        ssize_t n = read(0, buffer, sizeof(buffer));
        if (n > 0)
        {
            buffer[n] = 0;
            printf("echo# %s", buffer); // 会输入\n无需手动加
        }
        else if (n == 0)
        {
            printf("read done\n");
            break;
        }
        else
        {
            // 如果是非阻塞，底层数据就没有就绪，IO接口，会以错误形式返回
            // 所以，如何区分 底层不就绪 vs 真的出错呢？ 根据errno错误码
            // EWOULDBLOCK; EAGAIN; // 11号错误码
            if (errno == EWOULDBLOCK)
            {
                sleep(1);
                std::cout << "底层数据没有就绪，开始轮询检测" << std::endl;
                std::cout << "可以做其他事情" << std::endl;
                // do other thing
                continue;
            }
            // 被系统中断的系统调用
            else if (errno == EINTR)
            {
                continue;
            }
            else
            {
                perror("read");
                break;
            }

            // EWOULDBLOCK; EAGAIN; // 11号错误码
            // perror("read");
            // printf("%ld\n",n); // 打印read返回值
            // printf("%d\n",errno); // 打印错误码
            // break;
        }
    }
    return 0;
}